home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 28
/
Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso
/
Aminet
/
comm
/
fido
/
ConvPktSrc.lha
/
ConvPkt
/
ConvPkt15.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-06-19
|
21KB
|
920 lines
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/execbase.h>
#include <dos/dos.h>
#include <FidoNet.h>
#include <jbio.h>
#include <CharTabs.h>
#include <stdlib.h>
#include <string.h>
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#define VERSION "1.5"
UBYTE *ver="\0$VER: ConvPkt "VERSION" ("__COMMODORE_DATE__")";
struct jbList
{
struct jbNode *First;
struct jbNode *Last;
};
struct jbNode
{
struct jbNode *Next;
};
struct ChrsNode
{
struct jbNode Node;
UBYTE parsedpattern[200];
UBYTE *chrs;
UBYTE *defaultchrs;
};
struct jbList ChrsList;
jbNewList(struct jbList *list);
jbAddNode(struct jbList *list, struct jbNode *node);
jbFreeList(struct jbList *list,struct jbNode *firstnode,ULONG sizenode);
jbFreeNum(struct jbList *list,ULONG num,ULONG size);
jbFreeNode(struct jbList *list,struct jbNode *node,ULONG size);
#define PKT_MINREADLEN 200
#define PKT_CHUNKLEN 10000
struct TextChunk
{
struct TextChunk *Next;
ULONG Length;
UBYTE Data[PKT_CHUNKLEN];
};
extern struct ExecBase *SysBase;
struct FileNode
{
struct Node Node;
UBYTE File[200];
};
struct List FileList;
#define ARG_FILE 0
#define ARG_TO 1
#define ARG_CHRSLIST 2
#define ARG_DEFAULTCHRS 3
#define ARG_IGNORECHRS 4
#define ARG_NOCHRS 5
#define ARG_CHRSONLY 6
#define ARG_CP865 7
UBYTE *argstring="FILE/A,TOCHRS=TO,CHRSLIST/K,DEFAULTCHRS=DEFCHRS/K,IGNORECHRS/S,NOCHRS/S,CHRSONLY/S,CP865/S";
ULONG argarray[8];
struct PktHeader PktHeader;
struct PktMsgHeader PktMsgHeader;
UBYTE Msg_To[36];
UBYTE Msg_From[36];
UBYTE Msg_Subject[72];
UBYTE Msg_DateTime[20];
UBYTE Msg_CHRS[50];
UBYTE Msg_Area[100];
struct jbList Msg_TextChunks;
BOOL longread,shortread,nomem,diskfull,messageend;
BOOL brk;
#define CHARSET_SKIP -1
BOOL cmd_ignorechrs;
BOOL cmd_nochrs;
BOOL cmd_chrsonly;
UBYTE *cmd_chrs;
UBYTE *cmd_defaultchrs;
struct RDArgs *rdargs;
Xlat(UBYTE *buf,UBYTE *chrs,ULONG len)
{
ULONG c;
if(argarray[ARG_CP865])
{
if(chrs == IbmToAmiga) chrs=IbnToAmiga;
if(chrs == AmigaToIbm) chrs=AmigaToIbn;
if(chrs == DefToAmiga) chrs=DfnToAmiga;
}
if(!chrs)
return;
for(c=0;c<len;c++)
{
if(buf[c]!=0 && chrs[buf[c]]==0)
buf[c]='?';
else
buf[c]=chrs[buf[c]];
}
}
UBYTE *GetCharset(UBYTE *string,UBYTE *defchrs)
{
if(strncmp(string,"IBMPC",5)==0)
return(IbmToAmiga);
else if(strncmp(string,"SWEDISH",7)==0)
return(SF7ToAmiga);
else if(strncmp(string,"MAC",3)==0)
return(MacToAmiga);
else if(strncmp(string,"LATIN",5)==0)
return(NULL);
return(defchrs);
}
ProcessKludge(UBYTE *kludge, ULONG klen)
{
if(strncmp(kludge,"\x01CHRS:",6)==0)
{
strncpy(Msg_CHRS,&kludge[7],49);
if(klen-11<49) Msg_CHRS[klen-8]=0;
else Msg_CHRS[49]=0;
klen=0;
}
if(strncmp(kludge,"\x01CHARSET:",9)==0)
{
strncpy(Msg_CHRS,&kludge[10],49);
if(klen-11<49) Msg_CHRS[klen-11]=0;
else Msg_CHRS[49]=0;
klen=0;
}
return(klen);
}
ULONG ReadNull(UBYTE *buf, ULONG maxlen, struct jbFile *jb)
{
/* Reads from jb until buffer full or NULL */
WORD ch,c=0;
if(shortread) return(0);
ch=jbGetChar(jb);
while(ch!=-1 && ch!=0 && c!=maxlen-1)
{
buf[c++]=ch;
ch=jbGetChar(jb);
}
buf[c]=0;
if(ch==-1)
shortread=TRUE;
if(ch!=0 && c==maxlen-1)
longread=TRUE;
return(c);
}
ULONG ReadCR(UBYTE *buf, ULONG maxlen, struct jbFile *jb)
{
/* Reads from jb until buffer full or CR */
WORD ch,c=0;
ch=jbGetChar(jb);
while(ch!=-1 && ch!=0 && ch!=10 && ch !=13 && c!=maxlen-1)
{
buf[c++]=ch;
ch=jbGetChar(jb);
}
if(ch==13 || ch==10)
buf[c++]=ch;
if(ch==0) messageend=TRUE;
if(ch==-1) shortread=TRUE;
return(c);
}
void CleanMemMessage(void)
{
if(Msg_TextChunks.First->Next)
jbFreeList(&Msg_TextChunks,Msg_TextChunks.First->Next,sizeof(struct TextChunk));
}
BOOL WriteNull(struct jbFile *jb,UBYTE *str)
{
jbWrite(jb,str,strlen(str)+1);
}
ConvertPkt(UBYTE *file)
{
struct TextChunk *ThisChunk;
ULONG rlen,msgnum;
struct jbFile *jbin,*jbout;
UBYTE out[200];
UBYTE *chrs;
struct TextChunk *chunk;
BOOL noconv;
UBYTE firstline[200];
UBYTE area[200];
UBYTE *destchrs,*defchrs;
ULONG c;
struct ChrsNode *chrsnode;
BPTR l;
struct FileInfoBlock *fib;
Printf("Converting %s...\n",file);
if(!(l=Lock(file,SHARED_LOCK)))
{
Printf("Unable to lock file\n");
return;
}
if(!(fib=(struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock),MEMF_ANY)))
{
Printf("Out of memory\n");
UnLock(l);
return;
}
Examine(l,fib);
if(!(jbin=jbOpen(file,MODE_OLDFILE,10000)))
{
PrintFault(IoErr(),NULL);
UnLock(l);
FreeMem(fib,sizeof(struct FileInfoBlock));
return;
}
strcpy(out,file);
strncat(out,".tmp",190);
if(jbRead(jbin,&PktHeader,sizeof(struct PktHeader))!=sizeof(struct PktHeader))
{
Printf("Packet header is too short\n");
jbClose(jbin);
UnLock(l);
FreeMem(fib,sizeof(struct FileInfoBlock));
return;
}
if(PktHeader.PktType!=0x0200)
{
Printf("Not a Type-2 packet\n");
jbClose(jbin);
UnLock(l);
FreeMem(fib,sizeof(struct FileInfoBlock));
return;
}
if(!(jbout=jbOpen(out,MODE_NEWFILE,10000)))
{
jbClose(jbin);
PrintFault(IoErr(),NULL);
UnLock(l);
FreeMem(fib,sizeof(struct FileInfoBlock));
return;
}
jbWrite(jbout,&PktHeader,sizeof(struct PktHeader));
if(diskfull)
{
PrintFault(IoErr(),"I/O error");
jbClose(jbin);
jbClose(jbout);
DeleteFile(out);
UnLock(l);
FreeMem(fib,sizeof(struct FileInfoBlock));
return;
}
shortread=FALSE;
longread=FALSE;
if(jbRead(jbin,&PktMsgHeader,sizeof(struct PktMsgHeader)) < 2)
{
Printf("Message header for msg #1 is too short\n");
jbClose(jbin);
jbClose(jbout);
DeleteFile(out);
UnLock(l);
FreeMem(fib,sizeof(struct FileInfoBlock));
return;
}
msgnum=0;
while(PktMsgHeader.PktType==0x0200)
{
msgnum++;
((struct TextChunk *)Msg_TextChunks.First)->Length=NULL;
ThisChunk=Msg_TextChunks.First;
/* Get header strings */
Msg_CHRS[0]=0;
Msg_Area[0]=0;
ReadNull(Msg_DateTime,20,jbin);
ReadNull(Msg_To,36,jbin);
ReadNull(Msg_From,36,jbin);
ReadNull(Msg_Subject,72,jbin);
/* Corrupt packet? */
if(shortread)
{
Printf("Message header for msg #%lu is short\n",msgnum);
jbClose(jbin);
jbClose(jbout);
DeleteFile(out);
UnLock(l);
FreeMem(fib,sizeof(struct FileInfoBlock));
return;
}
if(longread)
{
Printf("Header strings too long in msg #%lu\n",msgnum);
jbClose(jbin);
jbClose(jbout);
DeleteFile(out);
UnLock(l);
FreeMem(fib,sizeof(struct FileInfoBlock));
return;
}
messageend=FALSE;
rlen=ReadCR(firstline,190,jbin);
firstline[rlen]=0;
destchrs=cmd_chrs;
defchrs=cmd_defaultchrs;
ThisChunk->Data[0]=0;
if(strncmp(firstline,"AREA:",5)==0)
{
strcpy(area,&firstline[5]);
for(c=strlen(area);c;c--) if(area[c]<32) area[c]=0;
strcpy(Msg_Area,area);
}
else
{
strcpy(area,"NETMAIL");
}
for(chrsnode=ChrsList.First;chrsnode;chrsnode=chrsnode->Node.Next)
if(MatchPatternNoCase(chrsnode->parsedpattern,area)) break;
if(chrsnode)
{
destchrs=chrsnode->chrs;
defchrs=chrsnode->defaultchrs;
}
ThisChunk->Length=strlen(ThisChunk->Data);
if(strncmp(firstline,"AREA:",5)!=0)
{
strcat(ThisChunk->Data,firstline);
if(ThisChunk->Data[ThisChunk->Length]==1 && destchrs!=(UBYTE *)CHARSET_SKIP)
rlen=ProcessKludge(&ThisChunk->Data[ThisChunk->Length],rlen);
T